package com.lxk.wx.robot;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.lxk.wx.robot.exception.BotException;
import com.lxk.wx.robot.msg.*;
import lombok.extern.slf4j.Slf4j;

import java.util.Collections;
import java.util.List;

/**
 * 企业微信机器人对象
 */
@Slf4j
public class Bot {

    /**
     * 企业微信群中获取的webhook地址
     */
    private final String webhook;

    /**
     * 文件上传地址
     */
    private final String uploadUrl;




    public Bot(String webhook) {
        if (webhook == null) {
            throw new BotException("webhook cannot be null");
        }
        log.info("bot webhook:{}", webhook);
        this.webhook = webhook;
        this.uploadUrl = webhook.replace("send", "upload_media") + "&type=file";

    }

    /**
     * 发送文本消息
     *
     * @param msg
     */
    public void send(String msg) {
        send(msg, false);
    }

    /**
     * 发送文本消息
     *
     * @param msg
     * @param atAll true：艾特所有人
     */
    public void send(String msg, boolean atAll) {
        TextMsg text = new TextMsg();
        text.setContent(msg);
        if (atAll) {
            text.setMentionedList(Collections.singletonList("@all"));
        }
        BotMsg botMsg = new BotMsg(text);
        doSend(botMsg);
    }

    /**
     * 发送文本消息
     *
     * @param msg
     */
    public void send(TextMsg msg) {
        BotMsg botMsg = new BotMsg(msg);
        doSend(botMsg);
    }

    /**
     * 发送markdown消息
     *
     * @param msg
     */
    public void send(MarkdownMsg msg) {
        BotMsg botMsg = new BotMsg(msg);
        doSend(botMsg);
    }

    /**
     * 发送图片消息
     *
     * @param msg
     */
    public void send(ImageMsg msg) {
        BotMsg botMsg = new BotMsg(msg);
        doSend(botMsg);
    }

    /**
     * 发送图文消息
     *
     * @param msg
     */
    public void send(ArticleMsg msg) {
        BotMsg botMsg = new BotMsg(msg);
        doSend(botMsg);
    }

    /**
     * 发送多个图文消息
     *
     * @param msg
     */
    public void send(List<ArticleMsg> msg) {
        BotMsg botMsg = new BotMsg(msg);
        doSend(botMsg);
    }

    /**
     * 发送文件消息
     *
     * @param msg
     */
    public void send(FileMsg msg) {
        BotMsg botMsg = new BotMsg(msg);
        doSend(botMsg);
    }




    /**
     * 请求微信接口，实现消息的发送
     *
     * @param botMsg
     */
    public void doSend(BotMsg botMsg) {
        //请求微信接口发送消息
        String botJson;
        try {
            botJson = JSONUtil.toJsonStr(botMsg);
        } catch (Exception ex) {
            throw new BotException(ex);
        }
        HttpRequest httpPost = HttpUtil.createPost(webhook);
        httpPost.body(botJson);
        String body = httpPost.execute().body();
        log.info("企业微信机器人返回{}", body);
    }

}

